package cn.edu.swu.hh;

import java.io.IOException;
import java.nio.file.*; //处理文件路径和文件操作
import java.time.LocalDateTime; //获取系统当前时间
import java.time.format.DateTimeFormatter; //格式化时间（转成字符串）
import java.util.*;

public class ImageManager {
    //使用Map来保存图片信息，Key=文件名，Value=绝对路径
    private final Map<String,String> imageMap = new LinkedHashMap<>();
    //保存图片的目录
    private final String imagesDir;
    //日志文件的路径
    private final String logFile;

    //构造方法，初始化时指定保存目录和日志文件
    public ImageManager(String imagesDir,String logFile) {
        this.imagesDir = imagesDir;
        this.logFile = logFile;
        loadExistingImages(); //启动时就把目录里已有的图片加载到imageMap
    }

    //把已经存在于目录里的图片文件加入管理表imageMap
    private void loadExistingImages() {
        try {
            Path dir = Paths.get(imagesDir);
            if (!Files.exists(dir)) //如果目录不存在，就直接返回
                return;
            try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)){
                for (Path p : stream) {
                    if (Files.isRegularFile(p)) { //确认是文件而不是文件夹
                        imageMap.put(p.getFileName().toString(),p.toAbsolutePath().toString());
                    }
                }
            }
        }catch (IOException e) {
            System.out.println("加载已有图片时出错：" + e.getMessage());
        }
    }
    //下载图片的方法
    public String downloadImage(String url) throws IOException {
        //根据URL自动生成一个文件名
        String fileName = buildFileName(url);
        Path savePath = Paths.get(imagesDir,fileName);

        //如果文件名重复，就在后面加“_1”...，避免覆盖
        int idx = 1;
        while (Files.exists(savePath)) {
            String base = stripExtension(fileName); //去掉扩展名（如：abc.jpg->abc）
            String ext = getExtension(fileName); //获取扩展名
            String newName = base + "_" + idx + ext;
            savePath = Paths.get(imagesDir,newName);
            idx++;
        }

        //真正下载图片，并返回绝对路径
        String absolutePath = FileUtils.saveImage(url,savePath.toString());
        if (absolutePath == null) //若下载失败，直接返回null
            return null;

        //把下载好的图片保存到Map里
        imageMap.put(fileName,absolutePath);
        //写日志，记录下载时间、URL、保存路径
        String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        String log = String.format("%s URL=%s -> %s",now,url,absolutePath);
        FileUtils.appendLog(logFile,log);

        return fileName; //返回保存下来的文件名
    }

    //列出所有已下载的图片
    public void listImages() {
        if (imageMap.isEmpty()) {
            System.out.println("当前没有已下载的图片。");
            return;
        }
        System.out.println("==========已下载图片列表==========");
        int i = 1;
        for (Map.Entry<String,String> e : imageMap.entrySet()) {
            System.out.printf("%d %s -> %s%n", i++,e.getKey(),e.getValue());
        }
    }

    //搜索图片（支持部分匹配）
    public void searchImage(String namePart) {
        if (namePart == null || namePart.isEmpty()) {
            System.out.println("搜索关键字不能为空。");
            return;
        }
        List<Map.Entry<String,String>> hits = new ArrayList<>();
        for (Map.Entry<String,String> e : imageMap.entrySet()) {
            //忽略大小写进行模糊匹配
            if (e.getKey().toLowerCase().contains(namePart.toLowerCase())) {
                hits.add(e);
            }
        }
        if (hits.isEmpty()) {
            System.out.println("未找到匹配的图片。");
            int i = 1;
            for (Map.Entry<String,String> e : hits) {
                System.out.printf("%d %s -> %s%n",i++,e.getKey(),e.getValue());
            }
        }
    }
    //根据URL推断一个文件名
    private String buildFileName(String url) {
        String candidate = url;
        //去掉URL参数部分（？xxx）
        int q = candidate.indexOf('?');
        if (q >= 0)
            candidate = candidate.substring(0,q);
        //去掉URL锚点（#）
        int hash = candidate.indexOf('#');
        if (hash >= 0)
            candidate = candidate.substring(0,hash);
        //截取最后一个斜杠后的部分
        int slash = candidate.lastIndexOf('/');
        candidate = (slash >= 0 ? candidate.substring(slash + 1) : candidate).trim();

        //如果没拿到文件名，就默认生成一个“img_时间戳.jpg”
        if (candidate.isEmpty() || candidate.contains(".")) {
            String ts = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
            candidate = "img_" + ts + ".jpg";
        }
        //把不合法的字符替换掉
        candidate = candidate.replaceAll("[\\\\/:*?\"<>|]","_");
        return candidate;
    }
    //获取扩展名
    private String getExtension(String name) {
        int dot = name.lastIndexOf('.');
        return dot >= 0 ? name.substring(dot) : "";

    }
    //去掉扩展名
    private String stripExtension(String name) {
        int dot = name.lastIndexOf('.');
        return dot >= 0 ? name.substring(0,dot) : name;
    }
}
